package br.edu.ifrn.view;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.richfaces.event.FileUploadEvent;
import org.richfaces.exception.FileUploadException;
import org.richfaces.model.UploadedFile;

import br.edu.ifrn.controller.DocumentoEJBLocal;
import br.edu.ifrn.model.Arquivo;
import br.edu.ifrn.model.Documento;
import br.edu.ifrn.model.Metadado;
import br.edu.ifrn.model.Metavalor;

@ManagedBean
@ViewScoped
public class DocumentoMBean {

	private Documento documento;
	private List<Documento> listaDocumento;
	private Date dataMetadado;
	private UploadedFile fileUpload;
	private boolean arquivoSelecionado;
	private StreamedContent fileDownload;

	public DocumentoMBean() {
		documento = new Documento();
		documento.setDataEntrada(new Date());
		documento.setDataCadastro(Calendar.getInstance().getTime());
	}

	@EJB
	private DocumentoEJBLocal documentoEJB;

	@PostConstruct
	public void construct() {
		listaDocumento = documentoEJB.listar();		
	}

	public String index() {
		return "/documento/index.xhtml";
	}

	public List<Documento> getListaDocumento() {
		return listaDocumento;
	}

	public void actionAtualizaTipo() {
		List<Metadado> meta = documento.getTipo().getMetadados();
		documento.getMetavalores().clear();
		for (Metadado m : meta) {
			documento.getMetavalores().add(new Metavalor(m, ""));
		}
	}
	
	public void descartarDocumento() {
		if (documento.isPassivelDescarte()) {
			documento.setDescartado(true);
			documentoEJB.salvar(documento);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_INFO,
							"Documento descartado", null));
		}

	}

	public Documento getDocumento() {
		return documento;
	}

	public Documento findDocumento(Long id) {
		return documentoEJB.find(id);
	}

	public void setDocumento(Documento documento) {
		this.documento = documento;
	}
		
	public List<Metavalor> getMetavalores() {  
		return documento.getMetavalores(); 
	}  
  
    public void setMetavalores(List<Metavalor> metavalores) {  
        documento.setMetavalores(metavalores);  
    }
	
	public Date getDataCadastro() {  
        return documento.getDataCadastro();  
    }  
  
    public void setDataCadastro(Date dataCadastro) {  
        documento.setDataCadastro(dataCadastro);  
    }
	
	public String actionSalvar() {
		try {
			if(fileUpload == null)
				throw new Exception();
			documento.setDataCadastro(new Date());
			Arquivo arquivo = new Arquivo(fileUpload.getData(), fileUpload.getName());
			documento.setArquivo(arquivo);
			documentoEJB.salvar(documento);
			
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_INFO,
							"Documento cadastrado com sucesso", null));
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Documento nao cadastrado, tente novamente", null));
		}

		return index();
	}

	public String actionRemover() {
		try {
			documentoEJB.remover(documento);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_INFO,
							"Documento removido com sucesso", null));
		} catch (Exception e) {
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Documento nao removido, tente novamente", null));
		}

		return index();
	}
	
	public void actionDownload(){
		try {
			String path = ((ServletContext)FacesContext.getCurrentInstance().
					getExternalContext().getContext()).getRealPath("/");
			FileOutputStream os = new FileOutputStream(path + documento.getArquivo().getNome());
			os.write(documento.getArquivo().getConteudo());
			os.flush();
			
			InputStream stream = new FileInputStream(path + documento.getArquivo().getNome());
			fileDownload = new DefaultStreamedContent(stream, "" , documento.getArquivo().getNome());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (FileUploadException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	public void listener(FileUploadEvent event) throws Exception {
		UploadedFile item = event.getUploadedFile();
		fileUpload = item;
		arquivoSelecionado = true;
	}

	public void clearUploadData() {
		fileUpload = null;
		arquivoSelecionado = false;
	}
	
	public void actionLimpar() {
		documento = new Documento();
	}

	public Date getDataMetadado() {
		return dataMetadado;
	}

	public void setDataMetadado(Date dataMetadado) {
		this.dataMetadado = dataMetadado;
	}

	public boolean isarquivoSelecionado() {
		return arquivoSelecionado;
	}

	public void setarquivoSelecionado(boolean arquivoSelecionado) {
		this.arquivoSelecionado = arquivoSelecionado;
	}
	
	public UploadedFile getFileUpload() {
		return fileUpload;
	}

	public void setFileUpload(UploadedFile fileUpload) {
		this.fileUpload = fileUpload;
	}

	public StreamedContent getFileDownload() {
		return fileDownload;
	}

	public void setFileDownload(StreamedContent fileDownload) {
		this.fileDownload = fileDownload;
	}
	
	public String actionDetalhar(Documento documento) {
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
	    session.setAttribute("documento", documento);
		
		return "/busca/detalhes.xhtml";
	}

}